﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using PlanProd;
using PlanProd.Contracts;
using PlanProd.Contracts.Validation;
using PlanProd.ServiceFactory;
using Web.Framework;
using WebAppPlanProduccion.Code;
using WebAppPlanProduccion.Code.Security;

namespace WebAppPlanProduccion.App
{
    public partial class PresupuestoProduccionCargaMasiva : BasePage
    {       
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                HasPermissionToSeeMe(PlanProdSecurity.PRESUPUESTOPRODUCCION_CARGAMASIVA);

                if (!this.IsPostBack)
                {
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private List<LinkButton> actionButtons = new List<LinkButton>();
        LinkButton guardarButton = new LinkButton();
        LinkButton cancelarButton = new LinkButton();
        LinkButton bajarArchivoDeEjemploPlanillaButton = new LinkButton();
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            guardarButton.ID = "BoCommandGuardar";
            guardarButton.Text = "Guardar";
            guardarButton.Click += new EventHandler(lnkGuardar_Click);
            actionButtons.Add(guardarButton);

            bajarArchivoDeEjemploPlanillaButton.ID = "BoCommandBajarEjemplo";
            bajarArchivoDeEjemploPlanillaButton.Text = "Bajar Excel de Ejemplo";
            bajarArchivoDeEjemploPlanillaButton.ClientIDMode = System.Web.UI.ClientIDMode.Static;
            bajarArchivoDeEjemploPlanillaButton.OnClientClick = "location.href = '/SampleFiles/EjPresupuestoComercialMasivo.xlsx'; return false;";
            actionButtons.Add(bajarArchivoDeEjemploPlanillaButton);   
            
            cancelarButton.ID = "BoCommandCancelar";
            cancelarButton.Text = "Cancelar";
            cancelarButton.Click += new EventHandler(lnkCancelar_Click);
            actionButtons.Add(cancelarButton);

            base.LoadContextActions(actionButtons);
        }		

        protected override void ApplySecurity()
        {
            base.ApplySecurity();

            guardarButton.Visible =
            lnkGuardar.Visible = HasPermissionFor(PlanProdSecurity.PRESUPUESTOPRODUCCION_CARGAMASIVA);
        }

        protected void lnkGuardar_Click(object sender, EventArgs e)
        {
            string filePath = string.Empty;
            try
            {
                if (this.filePresupuestoProduccion.HasFile)
                {
                    string tmpPath = HttpContext.Current.Server.MapPath("/Tmp");
                    string fileName = Guid.NewGuid().ToString();
                    filePath = Path.Combine(tmpPath, fileName);
                    this.filePresupuestoProduccion.SaveAs(filePath);
                    List<string> parseErrors = new List<string>();

                    // Cargar objetos de producto color
                    List<PresupuestoProduccionExcel> excelLines = ExcelHelper.GetPresupuestosDeProduccionExcelObjFromExcel(filePath);

                    // Tengo que validar que existan las temporadas, los destinos, los proveedores y los productos

                    // Cargo los productos a validar
                    List<ProductoValidation> productosAValidar = new List<ProductoValidation>();
                    var productosExcelList = (from l in excelLines
                                             select new
                                             {
                                                 ProductoIdExterno = l.ProductoId,
                                                 ColorIdExterno = l.ColorId
                                             }).Distinct();

                    foreach (var productoExcel in productosExcelList)
                    {
                        productosAValidar.Add(new ProductoValidation()
                        {
                            Producto = productoExcel.ProductoIdExterno,
                            ColorId = productoExcel.ColorIdExterno
                        });
                    }                    
                            
                    parseErrors.AddRange(excelLines.SelectMany(l => l.Errores.Select(err => err)).ToList());

                    List<ProductoValidation> productosValidados = WebServiceHelper.ValidarProductos(productosAValidar);

                    if (parseErrors.Count == 0 && productosValidados.Count == 0)
                    {

                        List<PresupuestoProduccion> presupuestosProduccionList = ExcelHelper.GetPresupuestosDeProduccionFromExcelObj(excelLines);
                        presupuestosProduccionList.ForEach(p => { p.EmpresaId = BaseWebPage.CompanyId; });

                        IPlanProdAdmin service = ServiceFactory.GetPlanProdAdminService();
                        service.SavePresupuestoProduccionList(WebServiceHelper.ServiceOptionsDefault, presupuestosProduccionList);                       
                        masterPage.ShowMessage("Los presupuestos se generaron correctamente", WebMessageType.Notification);
                        //presupuestoProduccion.DetalleDeProductos.AddRange(presupuestoProduccionDetalles);
                        //presupuestoProduccion = WebServiceHelper.SavePresupuestoProduccion(presupuestoProduccion);
                        //Response.Redirect(string.Format("/App/PresupuestoProduccionEdit.aspx?Id={0}", presupuestoProduccion.Id), true);
                    }
                    else
                    {
                        StringBuilder builder = new StringBuilder();
                        string separador = string.Empty;
                        foreach (string parseError in parseErrors)
                        {
                            builder.Append(separador);
                            builder.AppendLine(parseError);
                            separador = "<br />";
                        }

                        if (productosValidados.Count > 0)
                        {
                            builder.Append(separador);
                            builder.AppendLine("Los siguientes productos no existen en la base de datos:");
                            foreach (ProductoValidation productoInexistente in productosValidados)
                            {
                                builder.Append(separador);
                                builder.AppendLine(string.Format("Producto: {0}, Color: {1}", productoInexistente.Producto, productoInexistente.ColorId));
                                separador = "<br />";
                            }
                        }

                        masterPage.ShowMessage(builder.ToString(), WebMessageType.Error);
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
            finally
            {
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }
        }

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Response.Redirect("/App/PresupuestoProduccionList.aspx", true);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }
    }
}